Android : 如何在循环中使用相同的 AlarmManager?

Android : How to use same AlarmManager in loop?

我写了下面的报警方法

 public void alarm(int time){
    Intent intent = new Intent(MainActivity.this, Alarm.class);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0 , intent, 0);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+time*1000, pi);
}

此方法非常有效。但是当我多次调用该方法时出现问题。喜欢,

alarm(10);
alarm(50);

这次只调用alarm(10);,不调用alarm(50);

任何人请帮助它为什么显示这个问题!

您将相同的 ID 0PendingIntent::getBroadcast 中的第二个参数)提供给多个 PendingIntent。这是你的错误。

根据您设置的 FLAG,行为可能会有所不同。

考虑为每个 PEstandard flags 之一使用不同的 ID。

另见:

您的 PendingIntent 两次调用您的方法时都具有相同的属性。当您第二次调用 PendingIntent.getBroadcast() 时,它将 return 第一次创建的 PendingIntent

如果你想让闹钟触发两次,你需要这样做:

public void alarm(int time, int requestCode){
    Intent intent = new Intent(MainActivity.this, Alarm.class);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), requestCode , intent, 0);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+time*1000, pi);
}

然后这样称呼它:

alarm(10, 0);
alarm(50, 1);
// context variable contains your `Context`
AlarmManager mgrAlarm = (AlarmManager) context.getSystemService(ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();

for(i = 0; i < 10; ++i)
{
   Intent intent = new Intent(context, OnAlarmReceiver.class);
   // Loop counter `i` is used as a `requestCode`
   PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0);
   // Single alarms in 1, 2, ..., 10 minutes (in `i` minutes)
   mgrAlarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                SystemClock.elapsedRealtime() + 60000 * i, 
                pendingIntent); 

   intentArray.add(pendingIntent);
}

您提供的 ID 相同 (0) 您需要使用不同的唯一 ID。像这样使用不同的待定意图 ID。您可以使用毫秒作为 id。

public void alarm(int time, int requestCode){
    Intent intent = new Intent(MainActivity.this, Alarm.class);
    Long timeToMilliSeconds = timeToMilliSeconds(hour, minute);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), timeToMilliSeconds , intent, 0);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+time*1000, pi);
}

这样称呼它

alarm(10, 0);
alarm(50, 1);

对于多个 Pendingintent,它需要不同的 ID,因此在调用方法中传递 不同的ID。